import torch
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
'''
基础变换操作
'''
#ToTensor将PIL图像或者NUMPY数组转化为张量
from torchvision import transforms
transform=transforms.ToTensor()

#Normalize对数据进行标准化，是其符合特定的均值和标准差
#常用于图像数据，像素值归一化为零均值和单位方差
transform=transforms.Normalize(mean=[0.5],std=[0.5])#归一化到[-1,1]

#Resize调整图像的大小
transform=transforms.Resize((128,128))#将图像调整为128x128的大小

#CenterCrop从图像中心裁剪指定大小的区域
transform=transforms.CenterCrop(128)#裁剪128X128的区域

'''
数据增强方式
'''

#RandomCrop从图像中随机裁剪指定大小
transform=transforms.RandomCrop(128)

#RandomHorizontalFlip#以一定概率水平翻转图像
transform=transforms.RandomHorizontalFlip(p=0.5) #50% 概率翻转

#RandomRotation随机旋转一定角度
transform=transforms.RandomRotation(degrees=30)#随机旋转-30到30度

#ColorJitter随机改变图像的亮度，对比度，饱和度或色调
transform==transforms.ColorJitter(brightness=0.5,contrast=0.5)

'''
组合变换
'''
#transforms.Compose()将多个变换组合在一起，按照顺序一次应用
transform=transforms.Compose([
    transforms.Resize((128,128)),
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5],std=[0.5])

])

"""
实例
"""
from torchvision import datasets,transforms
from torch.utils.data import DataLoader 

#定义转换
transform=transforms.Compose([
    transforms.Resize((128,128)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5],std=[0.5]),
])

#加载数据集
train_dataset=datasets.MNIST(root='./data',train =True,transform=transform,download=True)

#使用dataloader
train_dataloader=DataLoader(dataset=train_dataset,batch_size=32,shuffle=True)

#查看转换后的数据
for images,labels, in train_dataloader:
    print('图像张量大小',images.size()) #[batch,1,128,128]
    break

import matplotlib.pyplot as plt
#原始和增强后的图像可视化
transform_augment=transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(30),
    transforms.ToTensor()
])

#加载数据集
dataset=datasets.MNIST(root='./data',train=True,download=True,transform=transform_augment)

#显示图像
def show_images(dataset):
    fig,axs = plt.subplots(1,5,figsize=(15,5))
    for i in range(5):
        image,label=dataset[i]
        axs[i].imshow(image.squeeze(0),cmap='gray')#将（1,H,W）转为(H,W)
        axs[i].set_title(f'Label:{label}')
        axs[i].axis('off')
    plt.show()
show_images(dataset)